libxc: Export xc_core_arch_map_p2m_writable()
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 1 Jun 2009 13:13:53 +0000 (14:13 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 1 Jun 2009 13:13:53 +0000 (14:13 +0100)
This patch firstly change the xc_core_arch_map_p2m() to map the p2m to
be writable, then it export this function.
One notice for this patch is, caller should make sure change the p2m
in flight will not cause trouble.

Signed-off-by: Jiang, Yunhong <yunhong.jiang@intel.com>
tools/libxc/xc_core.h
tools/libxc/xc_core_x86.c

index d148732f13dd69d5abb8f1d14ebb24f69ea4c495..b6d9138ae6e5f8809faeee4fd93b977b4de4c8eb 100644 (file)
@@ -143,6 +143,11 @@ int xc_core_arch_map_p2m(int xc_handle, unsigned int guest_width,
                          xc_dominfo_t *info, shared_info_any_t *live_shinfo,
                          xen_pfn_t **live_p2m, unsigned long *pfnp);
 
+int xc_core_arch_map_p2m_writable(int xc_handle, unsigned int guest_width,
+                                  xc_dominfo_t *info,
+                                  shared_info_any_t *live_shinfo,
+                                  xen_pfn_t **live_p2m, unsigned long *pfnp);
+
 
 #if defined (__i386__) || defined (__x86_64__)
 # include "xc_core_x86.h"
index 765c745cb6d8c80f2d4b7796e158fa4d6bc6c1f8..fc2a7a1192d147e89b76e5ce11b6f2955e7a9ca0 100644 (file)
@@ -75,10 +75,10 @@ xc_core_arch_memory_map_get(int xc_handle, struct xc_core_arch_context *unused,
     return 0;
 }
 
-int
-xc_core_arch_map_p2m(int xc_handle, unsigned int guest_width, xc_dominfo_t *info,
-                     shared_info_any_t *live_shinfo, xen_pfn_t **live_p2m,
-                     unsigned long *pfnp)
+static int
+xc_core_arch_map_p2m_rw(int xc_handle, unsigned int guest_width, xc_dominfo_t *info,
+                        shared_info_any_t *live_shinfo, xen_pfn_t **live_p2m,
+                        unsigned long *pfnp, int rw)
 {
     /* Double and single indirect references to the live P2M table */
     xen_pfn_t *live_p2m_frame_list_list = NULL;
@@ -156,7 +156,8 @@ xc_core_arch_map_p2m(int xc_handle, unsigned int guest_width, xc_dominfo_t *info
         for ( i = P2M_FL_ENTRIES - 1; i >= 0; i-- )
             p2m_frame_list[i] = ((uint32_t *)p2m_frame_list)[i];
 
-    *live_p2m = xc_map_foreign_pages(xc_handle, dom, PROT_READ,
+    *live_p2m = xc_map_foreign_pages(xc_handle, dom,
+                                    rw ? (PROT_READ | PROT_WRITE) : PROT_READ,
                                     p2m_frame_list,
                                     P2M_FL_ENTRIES);
 
@@ -189,6 +190,23 @@ out:
     return ret;
 }
 
+int
+xc_core_arch_map_p2m(int xc_handle, unsigned int guest_width, xc_dominfo_t *info,
+                        shared_info_any_t *live_shinfo, xen_pfn_t **live_p2m,
+                        unsigned long *pfnp)
+{
+    return xc_core_arch_map_p2m_rw(xc_handle, guest_width, info,
+                                   live_shinfo, live_p2m, pfnp, 0);
+}
+
+int
+xc_core_arch_map_p2m_writable(int xc_handle, unsigned int guest_width, xc_dominfo_t *info,
+                              shared_info_any_t *live_shinfo, xen_pfn_t **live_p2m,
+                              unsigned long *pfnp)
+{
+    return xc_core_arch_map_p2m_rw(xc_handle, guest_width, info,
+                                   live_shinfo, live_p2m, pfnp, 1);
+}
 /*
  * Local variables:
  * mode: C